package com.example.websockettest.api;

import com.alibaba.fastjson.JSON;
import com.example.websockettest.dataobject.User;
import com.example.websockettest.encoder.ResultWebSocketEncoder;
import com.example.websockettest.model.Result;
import org.springframework.web.bind.annotation.RestController;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

/**
 * 接受和返回Java对象的Websocket，以User类为例
 */
@ServerEndpoint(value = "/api/userSocket", encoders = {ResultWebSocketEncoder.class})
@RestController
public class UserWebSocketAPI {

	/**
	 * 连接建立成功调用的方法
	 */
	@OnOpen
	public void onOpen(Session session) {
		System.out.println("有新连接加入！ID是：" + session.getId());
	}

	/**
	 * 连接关闭调用的方法
	 */
	@OnClose
	public void onClose(Session session) throws IOException {
		System.out.println("有一连接关闭！ID是：" + session.getId());
		session.close();
	}

	/**
	 * 收到客户端消息后调用的方法
	 */
	@OnMessage
	public void onMessage(String message, Session session) throws EncodeException, IOException {
		// 接收到的仍然是字符串，只不过是JSON形式，可以进行解析
		User getUser = JSON.parseObject(message, User.class);
		System.out.println("接收到用户对象，id：" + getUser.getId() + " 名字：" + getUser.getName());
		// 再把接收到的用户对象发回去试试
		Result<User> result = new Result<>();
		result.setResultSuccess("接收成功！", getUser);
		session.getBasicRemote().sendObject(result);
	}

	/**
	 * 发生错误时调用
	 */
	@OnError
	public void onError(Session session, Throwable error) {
		System.out.println("发生错误！发生时间：" + System.currentTimeMillis() + "，ID是：" + session.getId());
		error.printStackTrace();
	}

}